﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using pos_trab_2.Model;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Net.Mail;
using pos_trab_2.View;

namespace pos_trab_2.View
{
    public partial class ControleSenha : Form
    {
        private string smtpServer;
        private string emailDestino;
        private string chave;

        public string Chave
        {
            get { return chave; }
            set { chave = value; }
        }

        public string EmailDestino
        {
            get { return emailDestino; }
            set { emailDestino = value; }
        }

        public string SmtpServer
        {
            get { return smtpServer; }
            set { smtpServer = value; }
        }

        public ControleSenha()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.cmbTipoAcesso.DataSource = System.Enum.GetNames(typeof(TipoAcesso));
        }

        private void btnAdicionar_Click(object sender, EventArgs e)
        {
            InputBox box = new InputBox(this);
            box.Show();
        }

        public void adicionaLinha()
        {
            if (!string.IsNullOrEmpty(chave))
            {
                Autenticacao auth = new Autenticacao();

                auth.Usuario = this.txtUsuario.Text;
                auth.Senha = auth.CodificaSenha(this.txtSenha.Text,chave);

                Debug.WriteLine("Valor selecionado: "+this.cmbTipoAcesso.SelectedValue);
                Debug.WriteLine("Index selecionado: " + this.cmbTipoAcesso.SelectedIndex);
                Debug.WriteLine("Item selecionado: " + this.cmbTipoAcesso.SelectedItem);

                Conexao conexao = new Conexao(1, this.txtNome.Text, this.richTxtDescricao.Text, this.txtURL.Text, this.txtPorta.Text, auth, DateTime.Now, this.cmbTipoAcesso.SelectedIndex);

                this.dataGridView1.Rows.Add(conexao.Nome,
                                            this.cmbTipoAcesso.SelectedValue,
                                            this.cmbTipoAcesso.SelectedIndex,
                                            conexao.Url,
                                            conexao.Porta,
                                            conexao.Autenticacao.Usuario,
                                            conexao.Descricao,
                                            conexao.DataModificacao.ToString(),
                                            conexao.Autenticacao.Senha);

                this.txtNome.Text = string.Empty;
                this.cmbTipoAcesso.SelectedIndex = 0;
                this.txtURL.Text = string.Empty;
                this.txtPorta.Text = string.Empty;
                this.txtUsuario.Text = string.Empty;
                this.txtSenha.Text = string.Empty;
                this.richTxtDescricao.Text = string.Empty;

                MessageBox.Show("Novo acesso adicionado à lista.", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                MessageBox.Show("Nenhum acesso foi adicionado ã lista. Tente novamente!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnSalvarLista_Click(object sender, EventArgs e)
        {
            int rowCount = this.dataGridView1.RowCount;
            List<Conexao> conexoes = new List<Conexao>();
            int registrosErrados = 0;
            try
            {
                for (int i = 0; i < rowCount-1; i++)
                {
                    DataGridViewRow row = this.dataGridView1.Rows[i];
                try
                {
                    Conexao conexao = new Conexao(i, row.Cells[0].Value.ToString(),
                                                    row.Cells[6].Value.ToString(),
                                                    row.Cells[3].Value.ToString(),
                                                    row.Cells[4].Value.ToString(),
                                                    new Autenticacao(row.Cells[5].Value.ToString(), row.Cells[8].Value.ToString()),
                                                    DateTime.Parse(row.Cells[7].Value.ToString()),
                                                    int.Parse(row.Cells[2].Value.ToString()));
                                        //0 conexao.Nome,
                                        //1 this.cmbTipoAcesso.SelectedValue,
                                        //2 this.cmbTipoAcesso.SelectedIndex,
                                        //3 conexao.Url,
                                        //4 conexao.Porta,
                                        //5 conexao.Autenticacao.Usuario,
                                        //6 conexao.Descricao,
                                        //7 conexao.DataModificacao.ToString(),
                                        //8 conexao.Autenticacao.Senha);
                    conexoes.Add(conexao);
                }
                catch (Exception)
                {
                    string mensagem = string.Format("Não foi possível salvar o arquivo porque o registro '{0}' não está completo. Remova o arquivo e inclua novamente pelo formulário de Novo Acesso", row.Cells[0].Value.ToString());
                    MessageBox.Show(mensagem);
                    registrosErrados++;
                }
            }

                if (registrosErrados == 0)
                {
                    SaveFileDialog fileDialog = new SaveFileDialog();
                    fileDialog.DefaultExt = ".csnh";
                    fileDialog.AddExtension = true;
                    fileDialog.Title = "Selecione um local para salvar";
                    fileDialog.Filter = "Arquivo de Senhas (*.csnh)| *.csnh";
                    fileDialog.InitialDirectory = Environment.CurrentDirectory;
                    fileDialog.ShowDialog(this);

                    string caminho = fileDialog.FileName;

                    FileStream fs = new FileStream(caminho, FileMode.Create);
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, conexoes);
                    fs.Close();
                }
                
            }
            catch(Exception)
            {
                MessageBox.Show("Não é possível adicionar direto no datagrid!\nUtilize o menu Novo Acesso");
            }
        }

        private void btnLimpaLista_Click(object sender, EventArgs e)
        {
            this.dataGridView1.Rows.Clear();
        }

        private void btnCarregaLista_Click(object sender, EventArgs e)
        {
            OpenFileDialog fileDialog = new OpenFileDialog();
            fileDialog.DefaultExt = ".csnh";
            fileDialog.AddExtension = true;
            fileDialog.Title = "Selecione um local para salvar";
            fileDialog.Filter = "Arquivo de Senhas (*.csnh)| *.csnh";
            fileDialog.InitialDirectory = Environment.CurrentDirectory;
            fileDialog.ShowDialog(this);

            string caminho = fileDialog.FileName;

            if (caminho != string.Empty)
            {
                FileStream fs = new FileStream(caminho, FileMode.Open);
                BinaryFormatter bf = new BinaryFormatter();
                List<Conexao> conexoes = (List<Conexao>)bf.Deserialize(fs);
                fs.Close();


                foreach (Conexao conexao in conexoes)
                {
                    this.dataGridView1.Rows.Add(conexao.Nome,
                                                System.Enum.GetNames(typeof(TipoAcesso))[conexao.TipoAcesso],
                                                conexao.TipoAcesso,
                                                conexao.Url,
                                                conexao.Porta,
                                                conexao.Autenticacao.Usuario,
                                                conexao.Descricao,
                                                conexao.DataModificacao.ToString(),
                                                conexao.Autenticacao.Senha);
                }
            }
        }

        private void btnExcluiRegistro_Click(object sender, EventArgs e)
        {

            DialogResult result = MessageBox.Show(this,"Deseja remover o registro selecionado?", "Remover registro", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (result == DialogResult.Yes)
            {
                foreach (DataGridViewRow linha in this.dataGridView1.SelectedRows)
                {
                    if (this.dataGridView1.NewRowIndex != linha.Index){
                        this.dataGridView1.Rows.Remove(linha);
                    }
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MailInputBox destino = new MailInputBox(this);
            destino.ShowDialog(this);
        }

        public void enviaEmail()
        {
            SmtpClient client = new SmtpClient(this.SmtpServer);

            foreach (DataGridViewRow row in this.dataGridView1.SelectedRows)
            {
                string nome = row.Cells[0].Value.ToString();

                string usuario = row.Cells[5].Value.ToString();
                string senha = row.Cells[8].Value.ToString();

                Autenticacao auth = new Autenticacao(usuario, senha);

                MailMessage m = new MailMessage();
                m.From = new MailAddress("controledesenhas@senhas.com.br", "Controle de Senhas");
                m.Subject = string.Format("Recuperacao de Senha - {0}", nome);
            
                m.To.Add(new MailAddress(this.EmailDestino));

                try
                {
                    m.Body = string.Format("A senha recuperada para {0} é: {1}", nome, auth.DecodificaSenha(auth.Senha, this.Chave));

                    Debug.WriteLine("Nome: " + nome);
                    Debug.WriteLine("Usuário: " + usuario);
                    Debug.WriteLine("Senha criptografada: " + senha);
                    Debug.WriteLine("Chave: " + this.Chave);
                    Debug.WriteLine("Senha correta: " + auth.DecodificaSenha(senha, this.Chave));
                    
                    client.Send(m);
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }
        }
    }
}